import pandas as pd
df=pdf.read_csv('movie_data.csv', encoding='utf-8')
df.loc[0, 'review'][-100:]
"ie SUCK (and I DO like them).<br /><br />For ex-hippies only...or if you're stoned. I give this a 1."
위와 같이 랜덤하게 섞은 영화 리뷰 데이터셋에 HTML 마크업(markup)은 물론 구두점과 글자가 아닌 문자가 포함되어 있다.
마크업에는 융요한 의미가 많지 않지만, 구두점은 특정 NLP 문제에서 쓸모 있는 추가 정보가 될 수 있다.
이번 sentimental analysis에서는 마크업 문자와 :) 와 같은 이모티콘 문자를 제외하고 모든 구두점 기호를 삭제하겠음
(이모티콘은 감성 분석에 유용하기 때문에 가운데 코모양 ‘-‘ 없애서 통합)
import re
def preprocessor(text):
text=re.sub('<[^>]*', '' , text)
emoticons=re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)', text)
text=(re.sub('[\W]+', ' ', text.lower())+' '.join(emoticons).replace('-', ''))
return text
HTML을 파싱(parsing)하는데 정규식을 사용하는 것은 좋지 못하다.
HTML 고급 도구를 사용하기 위해서는 파이썬의 HTML 파서 모듈을 사용하면 된다.
대문자 처리NLP에서 대문자가 특별한 의미를 가지고 있는 경우가 많지만, 감성분석에서는 의미가 없다고 가정하겠다.
preprocessor test
preprocessor(df.loc[0, 'review'][-100:])
preprocessor("</a>Thistest_hyperlink :) :-) :-( :( !?@")
' thistest_hyperlink :) :) :( :('
모든 데이터에 대하여 preprocessor 처리
df['review']=df['review'].apply(preprocessor)
Make text Token
공백 문자를 기준으로 토큰화
def tokenizer(text):
return text.split()
tokenizer('runners like running and thus they run')
['runners', 'like', 'running', 'and', 'thus', 'they', 'run']
어간 추출(stemming)
pip3 install nltk
여러 가지 형태를 갖는 단어를 같은 어간으로 매핑할 수 있다.
from nltk.stem.porter import PorterStemmer
porter=PorterStemmer()
def tokenizer_porter(text):
return [porter.stem(sord) for sord in text.split()]
tokenizer_porter('runners like running and thus they run')
['runner', 'like', 'run', 'and', 'thu', 'they', 'run']
포터 어간 추출 알고리즘은 가장 오래되고 간단한 어간 추출 알고리즘이다.
스노우볼 어간 추출기(Snowball(Porter2, English) stemmer)와 랭커스터 어간 추출기(Lancaster(Paice/Husk) stemmer)
가 인기 있는 다른 어간 추출기이다.
스노우볼과 랭커스터 어간 추출기가 모두 포터 어간 추출기보다 빠르지만, 랭커스터 어간 추출기는 포터 어간 추출기보다
훨씬 공격적인 것으로 알려져 있따.
불용어(stop-word)불용어는 문서의 종류를 구별하는데 사용할 수 있는 정보가 없거나, 아주 조금만 있는 어간을 말한다.
ex) is, and, has, like 등이 있다.
불용어 제거는 tf-idf보다 기본 단어 빈도나 정규화된 단어 빈도를 사용할 때 더 유용하다.
(tf-idf는 자주 등장하는 단어의 가중치가 이미 낮추어져 있다.
불용어는 nltk.download에 179개 제공하고 있다.
import nltk
nltk.download('stopwords')
/Users/csian/nltk_data에 다운로드
from nltk.corpus import stopwords
stop=stopwords.words('english')
[w for w in tokenizer_porter('a runner likes runing and runs a lot')[-10:] if w not in stop]
['runner', 'like', 'rune', 'run', 'lot']